Add GDK_MEMORY_R8G8B8A8_PREMULTIPLIED
authorAlexander Larsson <alexl@redhat.com>
Thu, 24 Sep 2020 13:01:51 +0000 (15:01 +0200)
committerAlexander Larsson <alexl@redhat.com>
Fri, 25 Sep 2020 07:31:43 +0000 (09:31 +0200)
This is the default OpenGL format, and in fact the only pixel format
that GLES supports uploading as. Actually, the premultiplied part is
really just about how we use the textures, but all textures in GTK
are premultiplied.

gdk/gdkmemorytexture.c
gdk/gdkmemorytexture.h
testsuite/gdk/memorytexture.c

index 08215820b550873f75c8ff310a4c475b881ac073..5ed0b988dc3389c91d63ef9991bfe30b4cbfd92a 100644 (file)
@@ -45,6 +45,7 @@ gdk_memory_format_bytes_per_pixel (GdkMemoryFormat format)
     {
     case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED:
     case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED:
+    case GDK_MEMORY_R8G8B8A8_PREMULTIPLIED:
     case GDK_MEMORY_B8G8R8A8:
     case GDK_MEMORY_A8R8G8B8:
     case GDK_MEMORY_R8G8B8A8:
@@ -199,6 +200,9 @@ convert_swizzle ## A ## R ## G ## B (guchar       *dest_data, \
 }
 
 SWIZZLE(3,2,1,0)
+SWIZZLE(2,1,0,3)
+SWIZZLE(3,0,1,2)
+SWIZZLE(1,2,3,0)
 
 #define SWIZZLE_OPAQUE(A,R,G,B) \
 static void \
@@ -267,6 +271,10 @@ SWIZZLE_PREMULTIPLY (3,2,1,0, 3,0,1,2)
 SWIZZLE_PREMULTIPLY (0,1,2,3, 3,0,1,2)
 SWIZZLE_PREMULTIPLY (3,2,1,0, 0,3,2,1)
 SWIZZLE_PREMULTIPLY (0,1,2,3, 0,3,2,1)
+SWIZZLE_PREMULTIPLY (3,0,1,2, 3,2,1,0)
+SWIZZLE_PREMULTIPLY (3,0,1,2, 0,1,2,3)
+SWIZZLE_PREMULTIPLY (3,0,1,2, 3,0,1,2)
+SWIZZLE_PREMULTIPLY (3,0,1,2, 0,3,2,1)
 
 typedef void (* ConversionFunc) (guchar       *dest_data,
                                  gsize         dest_stride,
@@ -275,16 +283,17 @@ typedef void (* ConversionFunc) (guchar       *dest_data,
                                  gsize         width,
                                  gsize         height);
 
-static ConversionFunc converters[GDK_MEMORY_N_FORMATS][2] =
+static ConversionFunc converters[GDK_MEMORY_N_FORMATS][3] =
 {
-  { convert_memcpy, convert_swizzle3210 },
-  { convert_swizzle3210, convert_memcpy },
-  { convert_swizzle_premultiply_3210_3210, convert_swizzle_premultiply_0123_3210 },
-  { convert_swizzle_premultiply_3210_0123, convert_swizzle_premultiply_0123_0123 },
-  { convert_swizzle_premultiply_3210_3012, convert_swizzle_premultiply_0123_3012 },
-  { convert_swizzle_premultiply_3210_0321, convert_swizzle_premultiply_0123_0321 },
-  { convert_swizzle_opaque_3210, convert_swizzle_opaque_0123 },
-  { convert_swizzle_opaque_3012, convert_swizzle_opaque_0321 }
+  { convert_memcpy, convert_swizzle3210, convert_swizzle2103 },
+  { convert_swizzle3210, convert_memcpy, convert_swizzle3012 },
+  { convert_swizzle2103, convert_swizzle1230, convert_memcpy },
+  { convert_swizzle_premultiply_3210_3210, convert_swizzle_premultiply_0123_3210, convert_swizzle_premultiply_3012_3210,  },
+  { convert_swizzle_premultiply_3210_0123, convert_swizzle_premultiply_0123_0123, convert_swizzle_premultiply_3012_0123 },
+  { convert_swizzle_premultiply_3210_3012, convert_swizzle_premultiply_0123_3012, convert_swizzle_premultiply_3012_3012 },
+  { convert_swizzle_premultiply_3210_0321, convert_swizzle_premultiply_0123_0321, convert_swizzle_premultiply_3012_0321 },
+  { convert_swizzle_opaque_3210, convert_swizzle_opaque_0123, convert_swizzle_opaque_3012 },
+  { convert_swizzle_opaque_3012, convert_swizzle_opaque_0321, convert_swizzle_opaque_3210 }
 };
 
 void
@@ -297,7 +306,7 @@ gdk_memory_convert (guchar          *dest_data,
                     gsize            width,
                     gsize            height)
 {
-  g_assert (dest_format < 2);
+  g_assert (dest_format < 3);
   g_assert (src_format < GDK_MEMORY_N_FORMATS);
 
   converters[src_format][dest_format] (dest_data, dest_stride, src_data, src_stride, width, height);
index eea2fda32451fc0af7e7b5524609262c32ee9341..b24e8c67966d12e75692af4fd8af1b7c6d264e71 100644 (file)
@@ -34,6 +34,8 @@ G_BEGIN_DECLS
  *     The color values are premultiplied with the alpha value.
  * @GDK_MEMORY_A8R8G8B8_PREMULTIPLIED: 4 bytes; for alpha, red, green, blue.
  *     The color values are premultiplied with the alpha value.
+ * @GDK_MEMORY_R8G8B8A8_PREMULTIPLIED: 4 bytes; for red, green, blue, alpha
+ *     The color values are premultiplied with the alpha value.
  * @GDK_MEMORY_B8G8R8A8: 4 bytes; for blue, green, red, alpha.
  * @GDK_MEMORY_A8R8G8B8: 4 bytes; for alpha, red, green, blue.
  * @GDK_MEMORY_R8G8B8A8: 4 bytes; for red, green, blue, alpha.
@@ -58,6 +60,7 @@ G_BEGIN_DECLS
 typedef enum {
   GDK_MEMORY_B8G8R8A8_PREMULTIPLIED,
   GDK_MEMORY_A8R8G8B8_PREMULTIPLIED,
+  GDK_MEMORY_R8G8B8A8_PREMULTIPLIED,
   GDK_MEMORY_B8G8R8A8,
   GDK_MEMORY_A8R8G8B8,
   GDK_MEMORY_R8G8B8A8,
index 381d61aac7be5c2942231125d018db805071ec12..950de41b0a94f460ece3c2a4aa3d545939f91b45 100644 (file)
@@ -37,6 +37,7 @@ typedef struct _TestData {
 static MemoryData tests[GDK_MEMORY_N_FORMATS] = {
   { 4, FALSE, { RGBA(FF,00,00,FF), RGBA(00,FF,00,FF), RGBA(00,00,FF,FF), RGBA(00,00,00,00), RGBA(66,22,44,AA) } },
   { 4, FALSE, { RGBA(FF,00,00,FF), RGBA(FF,00,FF,00), RGBA(FF,FF,00,00), RGBA(00,00,00,00), RGBA(AA,44,22,66) } },
+  { 4, FALSE, { RGBA(00,00,FF,FF), RGBA(00,FF,00,FF), RGBA(FF,00,00,FF), RGBA(00,00,00,00), RGBA(44,22,66,AA) } },
   { 4, FALSE, { RGBA(FF,00,00,FF), RGBA(00,FF,00,FF), RGBA(00,00,FF,FF), RGBA(00,00,00,00), RGBA(99,33,66,AA) } },
   { 4, FALSE, { RGBA(FF,00,00,FF), RGBA(FF,00,FF,00), RGBA(FF,FF,00,00), RGBA(00,00,00,00), RGBA(AA,66,33,99) } },
   { 4, FALSE, { RGBA(00,00,FF,FF), RGBA(00,FF,00,FF), RGBA(FF,00,00,FF), RGBA(00,00,00,00), RGBA(66,33,99,AA) } },